static void
-add_blink_timeout (GtkTextView *self)
+add_blink_timeout (GtkTextView *self,
+ gboolean delay)
{
GtkTextViewPrivate *priv = self->priv;
BlinkData *data;
data = g_new (BlinkData, 1);
data->start = priv->blink_start_time;
+ if (delay)
+ data->start += blink_time * 1000 / 2;
data->end = data->start + blink_time * 1000;
priv->blink_tick = gtk_widget_add_tick_callback (GTK_WIDGET (self),
GdkFrameClock *clock,
gpointer user_data)
{
- GtkTextView *text_view;
- GtkTextViewPrivate *priv;
+ GtkTextView *text_view = GTK_TEXT_VIEW (widget);
+ GtkTextViewPrivate *priv = text_view->priv;
+ BlinkData *data = user_data;
gint blink_timeout;
gint blink_time;
guint64 now;
float phase;
- BlinkData *data = user_data;
-
- text_view = GTK_TEXT_VIEW (widget);
- priv = text_view->priv;
+ float alpha;
if (!gtk_widget_has_focus (GTK_WIDGET (text_view)))
{
phase = (now - data->start) / (float) (data->end - data->start);
- priv->cursor_alpha = blink_alpha (phase);
-
if (now >= data->end)
{
data->start = data->end;
data->end = data->start + blink_time * 1000;
}
- gtk_widget_queue_draw (widget);
+ alpha = blink_alpha (phase);
+
+ if (priv->cursor_alpha != alpha)
+ {
+ priv->cursor_alpha = alpha;
+ gtk_widget_queue_draw (widget);
+ }
return G_SOURCE_CONTINUE;
}
if (cursor_blinks (text_view))
{
if (!priv->blink_tick)
- add_blink_timeout (text_view);
+ add_blink_timeout (text_view, FALSE);
}
else
{
if (cursor_blinks (text_view))
{
remove_blink_timeout (text_view);
- add_blink_timeout (text_view);
+ add_blink_timeout (text_view, TRUE);
}
}